package com.cskaoyan.javase.exception._2finally;

/**
 * @description: finally关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * finally关键字不能单独使用,必须以finally代码块的形式出现
 *  并且finally代码块也不能单独使用,必须放在try...catch之后或者直接放在try代码块后面
 *
 * finally代码不论try..catch如何执行,它都必然执行,这是它最重要的特点
 * 依据它必然执行的特点,在Java当中经常用于I/O,网络编程,数据库等等容易出现异常且需要占用系统额外资源时,
 *      把释放资源的代码写进finally代码块中,这样保证无论程序结果如何,都能正确,准时释放系统资源
 * 这就是Java当中最常用的手动释放系统资源的方式
 *
 * > 一些奇思妙想
 * - try代码块如果有return
 *   - 程序会先执行完finally代码块，回过头执行try中的return,但是try...catch..finally之后的代码不会执行了
 *
 * - catch代码块中如果有return，并且catch正常捕获异常执行
 *   - 程序会先执行完finally代码块后，再回去执行catch中return，从catch代码块中结束方法
 *
 * - finally代码中有return
 *   - 不会影响finally代码块执行
 *
 * - 如果finally和catch中都有return
 *   - 程序会直接从finally代码块中的return结束方法
 * - 如果try中的异常不能正常捕获,但是finally中有return
 *   - **注意此时程序会跳过这个异常，不会抛出异常给JVM报错**
 * - try中的return语句return的是一个方法，但是这个方法又产生了异常
 *   - 自己测试一下吧
 *
 *
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println("before");
        try {
            System.out.println(10 / 0);
            //return;
        } catch (NullPointerException e) {
            e.printStackTrace();
        } finally {
            System.out.println("hello world!");
            return;
        }
        //System.out.println("after");

    }
}
